home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 June / Macworld (1999-06).dmg / Shareware World / Info / For Developers / MacZoop2.0.sea / MacZoop2.0 / Required Classes / ZArray.h < prev    next >
Text File  |  1999-01-27  |  4KB  |  140 lines

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            MacZoop - "the framework for the rest of us"         
  5. *
  6. *
  7. *
  8. *            ZArray.h            -- the basic container class object
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21.  
  22. #pragma once
  23.  
  24. #ifndef __ZARRAY__
  25. #define    __ZARRAY__
  26.  
  27. #ifndef __ZCOMRADE__
  28. #include    "ZComrade.h"
  29. #endif
  30.  
  31. // form of the basic grovelling function you can pass to DoForEach(). Read note below.
  32.  
  33. typedef void (*IteratorProcPtr)( void* item, const long ref );
  34.  
  35. // Form of the sort comparison function you can pass to Sort(). This function should return
  36. // -1 if a < b, +1 if a > b, and 0 if they are equal. The sort function uses a very fast
  37. // shellsort algorithm. <itema> and <itemb> are POINTERS to the data held in the array, whatever
  38. // it is. If the array contains object pointers, this is therefore a POINTER to a POINTER to the
  39. // object, not the object pointer itself. This is an important point if you use Sort() with the
  40. // ZObjectArray<> class. This is also true of the grovelling function above.
  41.  
  42. typedef short (*SortCmpProcPtr)( void* itema, void* itemb, const long ref );
  43.  
  44. // set up streaming stuff:
  45.  
  46. DEFINECLASSID( ZArray, 'zarr' );
  47.  
  48. // class definition
  49.  
  50. class ZArray : public ZComrade
  51. {
  52. protected:
  53.     Handle        a;
  54.     long        blkSize;
  55.     long        numElements;
  56.     long        physicalBlks;
  57.     
  58. public:
  59.     
  60.     ZArray( short elementSize = sizeof(Ptr));
  61.     virtual ~ZArray();
  62.  
  63. // putting stuff in the array
  64.     
  65.     virtual void    InsertItem( void* item, const long index );
  66.     virtual void    AppendItem( void* item );
  67.     virtual void    SetArrayItem( void* item, const long index );
  68.     virtual void    ConcatenateArray( ZArray* anArray );
  69.  
  70. // getting stuff out
  71.  
  72.     virtual void    GetArrayItem( void* item, const long index );
  73.     virtual long    CountItems();
  74.     virtual long    FindIndex( void* item );
  75.  
  76. // deleting items
  77.  
  78.     virtual void    DeleteItem( const long index );
  79.     virtual void    DeleteAll();
  80.     
  81. // moving items
  82.  
  83.     virtual void    MoveItem( const long curIndex, const long newIndex );
  84.     virtual void    Swap( const long itema, const long itemb );
  85.     
  86. // grovelling over the items
  87.  
  88.     virtual void    DoForEach( IteratorProcPtr aProc, const long ref );
  89.     
  90. // sorting the items
  91.  
  92.     virtual void    Sort( SortCmpProcPtr compareProc, const long ref );
  93.     virtual void    Sort();
  94.     virtual void    QSort( SortCmpProcPtr compareProc );
  95.     virtual short    Compare( void* itema, void* itemb, const long ref );
  96.     
  97. // inserting items in a sorted list
  98.  
  99.     virtual long    InsertSortedItem( void* item, SortCmpProcPtr compareProc, const long ref = 0 );
  100.     virtual long    InsertSortedItem( void* item, const long ref = 0 );
  101.     
  102. // finding items in a sorted list
  103.  
  104.     virtual long    BFindIndex( void* item, SortCmpProcPtr compareProc, const long ref );
  105.     
  106. // streaming
  107.  
  108.     virtual void    ReadFromStream( ZStream* aStream );
  109.     virtual void    WriteToStream( ZStream* aStream );
  110.  
  111. protected:    
  112.     
  113.     virtual void    InsertElement( const long index );        
  114.     virtual void    DeleteElement( const long index );
  115. };
  116.  
  117. #define        kIndexOutOfRangeErr        230
  118. #define        kElementSizeMismatchErr    231
  119. #define        kUndefinedCompProcErr    232
  120.  
  121. // message "transmitted" when array is manipulated
  122.  
  123. enum
  124. {
  125.     msgArrayItemAdded = 'arr1',
  126.     msgArrayItemDeleted,
  127.     msgArrayItemMoved,
  128.     msgArrayItemChanged,
  129.     msgArrayItemInserted,
  130.     msgArrayAllDeleted
  131. };
  132.  
  133. // to improve speed, the storage is expanded in sets of blocks
  134. // according to this constant- when full, this many blocks are
  135. // added.
  136.  
  137. #define        kNumPhysicalBlockAlloc            8
  138.  
  139.  
  140. #endif